"use strict"

var client = require("mongodb").MongoClient;
var config = require("./config.js");

var userNameRangeError = new RangeError();
var passwordRangeError = new RangeError();
var userExistedError = new RangeError();
var userNotExistedError = new RangeError();

/**
 * 用户
 */
class User {
	/**
	 * 用户名不在范围内
	 */
	static get userNameRangeError() {
		return userNameRangeError;
	}
	
	/**
	 * 密码不在范围内
	 */
	static get passwordRangeError() {
		return passwordRangeError;
	}
	
	/**
	 * 用户已存在
	 */
	static get userExistedError() {
		return userExistedError;
	}
	
	/**
	 * 用户不存在
	 */
	static get userNotExistedError() {
		return userNotExistedError;
	}

	/**
	 * 注册新用户
	 * @param {string} userName 用户名，必须不少于3个字符不多于16个字符
	 * @param {string} password 密码，必须不少于3个字符不多于16个字符
	 */
	static register(userName, password) {
		return new Promise(function (resolve, reject) {
			if (userName.length < 3 || userName.length > 16)
				reject(userNameRangeError);
			else if (password.length < 3 || password.length > 16)
				reject(passwordRangeError);
			else
				client.connect(config.authenticationUri, function (err, db) {
					if (err)
						reject(err);
					else {
						var users = db.collection("users");
						users.find({
							"userName": userName
						}).limit(1).next(function (err, result) {
							if (err) {
								reject(err);
								db.close();
							} else if (result != null) {
								reject(userExistedError);
								db.close();
							} else
								users.insertOne({
									"userName": userName,
									"password": password
								}, function (err, result) {
									if (err)
										reject(err);
									else
										resolve(result.ops[0]);
									db.close();
								});
						});
					}
				});
		});
	}
	
	/**
	 * 登录
	 * @param {string} userName 用户名
	 * @param {string} password 密码
	 */
	static signIn(userName, password) {
		return new Promise(function (resolve, reject) {
			if (userName.length < 3 || userName.length > 16)
				reject(userNameRangeError);
			else if (password.length < 3 || password.length > 16)
				reject(passwordRangeError);
			else
				client.connect(config.authenticationUri, function (err, db) {
					if (err)
						reject(err);
					else
						db.collection("users").find({
							"userName": userName
						}).limit(1).next(function (err, result) {
							if (err)
								reject(err);
							else if (result == null)
								reject(userNotExistedError);
							else if (result.password !== password)
								reject();
							else
								resolve(result);
							db.close();
						});
				});
		});
	}
}

module.exports = User;